package br.edu.univas.si.lab3.bankmanager.controller;


import java.text.NumberFormat;

import br.edu.univas.si.lab3.bankmanager.listeners.SaldoListener;
import br.edu.univas.si.lab3.bankmanager.model.ClienteFisicoTO;
import br.edu.univas.si.lab3.bankmanager.model.ClienteTO;
import br.edu.univas.si.lab3.bankmanager.model.ContaCorrenteTO;
import br.edu.univas.si.lab3.bankmanager.model.ContaTO;
import br.edu.univas.si.lab3.bankmanager.model.DAO;
import br.edu.univas.si.lab3.bankmanager.model.DAOException;
import br.edu.univas.si.lab3.bankmanager.view.FrameBusca;
import br.edu.univas.si.lab3.bankmanager.view.FrameListar;


public class ControllerSaldo {

	private DAO dao;
	private FrameBusca busca;
	private FrameListar listar;
	private Integer numeroConta;
	private ContaTO conta;
	private ClienteTO cliente;
	private Integer menssagem = 0;
	
	
	public ControllerSaldo(DAO dao) {
		this.dao = dao;
	}

	public void consultaSaldo(ClienteTO cliente) {
		Integer modificador = 5;
		busca = new FrameBusca(cliente, modificador);
		busca.addSaldolisteners(new SaldoListener() {
			@Override
			public void saldoConta(Integer numeroConta) {}
			
			@Override
			public void saldoCancelado() {
				busca.dispose();
			}
			@Override
			public void buscaConta(String numeroConta) throws DAOException {
				Integer numero_conta = validaNumero(numeroConta);
				if(numero_conta != null)
					verificarNumero(numero_conta);
				else
					busca.getMessage(menssagem);
			}

			@Override
			public void saldoOK() {}
		});
		busca.setVisible(true);
	}

	private void verificarNumero(Integer numeroConta) throws DAOException {
		Boolean contaExiste = dao.buscaConta(numeroConta);
		if(contaExiste){
			this.numeroConta = numeroConta;
			busca.dispose();
			
			ContaCorrenteTO contaAux = new ContaCorrenteTO();
			this.conta = contaAux;
			
			ContaTO conta = dao.getContaInfo(this.conta,numeroConta);
			
			ClienteFisicoTO clienteAux = new ClienteFisicoTO();
			this.cliente = clienteAux;
			ClienteTO cliente = dao.getClienteInfo(conta.getTitular(), this.cliente);
			
			Integer modificador = 2;
			listar = new FrameListar(cliente,conta,modificador);
			listar.addSaldolisteners(new SaldoListener() {
				
				@Override
				public void saldoOK() {
					listar.dispose();
				}
				
				@Override
				public void saldoConta(Integer numeroConta) {}
				
				@Override
				public void saldoCancelado() {}
				
				@Override
				public void buscaConta(String numeroConta) {}
			});
			listar.setVisible(true);
		}else{
			busca.getMessage(2);
		}
		busca.dispose();
	}
	
	private Integer validaNumero(String numeroConta) {
		try {
			if(numeroConta.length() == 7){
				this.numeroConta = NumberFormat.getInstance().parse(numeroConta).intValue(); 
				return this.numeroConta;
			}
			else{
				menssagem = 3;
				return null;
			}
		} catch (Exception e) {
			menssagem = 3;
			return null;
		}
	}

}
